package com.example.redis.redis;

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Slf4j
@Component
public class RedisStringUtil {
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 设置基本的对象
     *
     * @param key 存入的键值
     * @param value 存入的值
     * @param timeout 过期时间
     * @param timeUnit 时间颗粒度
     */
    public void setValue(String key, String value, long timeout, TimeUnit timeUnit){
        stringRedisTemplate.opsForValue().set(key,value,timeout,timeUnit);
    }

    /**
     * 判断key是否存在
     * @param key 需要判断的key
     * @return 是否存在，结果可能为null
     */
    public Boolean hasKey(String key){
        return stringRedisTemplate.hasKey(key);
    }

    /**
     * 获取缓存value
     * @param key 需要获取的key
     * @return key对应的value
     */
    public String getValue(String key){
        return key == null ? null : stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * 通过前缀获取所有key
     * @param prefix 前缀
     * @return 所有带该前缀的key集合
     */
    public Set<String> getPrefixKeys(String prefix){
        if(prefix == null){
            return null;
        }
        return stringRedisTemplate.keys(prefix + "*");
    }

    public List<String> getPrefixValues(String prefix){
        Set<String> keySet=getPrefixKeys(prefix);
        if(keySet==null){
            return null;
        }
        return stringRedisTemplate.opsForValue().multiGet(keySet);
    }



    /**
     * 设置过期时间
     * @param key 需要设置过期时间的key
     * @param timeout 过期时间
     * @param timeUnit 时间颗粒度
     * @return 是否设置成功，可能为null
     */
    public Boolean expire(String key, long timeout, TimeUnit timeUnit){
        return stringRedisTemplate.expire(key, timeout, timeUnit);
    }

    public Long getExpire(String key,TimeUnit timeUnit){
        return stringRedisTemplate.getExpire(key,timeUnit);
    }


}
